/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.dwh.trigger;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Contiene los metodos de impresion en pantalla y escribe al log de la
 * aplicacion. En cada impresion se agrega un prefijo que indica el tipo de
 * texto (INFO, ERROR, WARNING, TRIGGER, ACCEPT y REJECT) mas la fecha y hora
 * del sistema (en formato yyyyMMdd HH:mm:ss). Tipo de textos:
 * <PRE>
 *      INFO   : indica que el texto es informativo, se usa para informar que esta
 *               pasando en la aplicacion, inicio de servidor, inicio de las SLU y
 *               colas, etc.
 *      ERROR  : indica que el texto es de error, en el mayor de los casos cuando
 *               se levanta una excepcion.
 *      WARNING: indica que el texto es una advertencia, en el mayor de los casos
 *               cuando se da un timeout en el server esperando una conexion
 *               o esperando trigger con alguna SLU.
 *      TRIGGER: indica que el trigger se envio, se utiliza cuando el trigger
 *               ya fue enviado a la cola y se recibio una respuesta.
 *      REJECT : indica que el que se rechazo un trigger, se utiliza cuando un
 *               trigger no tiene una cola destino (segun el archivo de configuracion)
 *      ACCEPT : indica que se acepto una conexion con una SLU.
 *
 * </PRE>
 *
 * @author Jose Carlos Palma
 * @version v1.0
 */
public class Log {

    static {
        try {
            logFile = new PrintWriter(new FileOutputStream("trigger.log", true));
        } catch (FileNotFoundException ex) {
            System.out.println("Error al abrir el log, "
                    + (ex.getStackTrace() != null ? ex.getStackTrace()[ex.getStackTrace().length - 1] : ex.getMessage()));
            Runtime.getRuntime().exit(1);
        }
    }
    /**
     * Indica el formato de fecha y hora para la salida del texto.
     */
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
    /**
     * Salida al archivo log.
     */
    private static PrintWriter logFile;

    /**
     * Imprime en pantalla y escribe al log un texto informativo.
     *
     * @param str es el texto.
     */
    public static void info(String str) {
        String line = "INFO[" + sdf.format(new Date()) + "]>>> " + str;
        logFile.println(line);
        System.out.println(line);
    }

    /**
     * Imprime en pantalla y escribe al log un texto de error.
     *
     * @param str es el texto.
     */
    public static void error(String str) {
        String line = "ERROR[" + sdf.format(new Date()) + "]>>> " + str;
        logFile.println(line);
        System.out.println(line);
    }

    /**
     * Impreme en pantalla y escribe al log un texto de advertencia.
     *
     * @param str es el texto.
     */
    public static void warning(String str) {
        String line = "WARNING[" + sdf.format(new Date()) + "]>>> " + str;
        logFile.println(line);
        System.out.println(line);
    }

    /**
     * Imprime en pantalla y escribe al log un trigger.
     *
     * @param trigger es el trigger.
     * @see org.dwh.trigger.Trigger#toString()
     */
    public static void trigger(Trigger trigger) {
        String line = "TRIGGER[" + sdf.format(new Date()) + "]>>> " + trigger;
        logFile.println(line);
        System.out.println(line);
    }

    /**
     * Imprime en pantalla y escribe al log un texto de aceptacion.
     *
     * @param str es el texto.
     */
    public static void accept(String str) {
        String line = "ACCEPT[" + sdf.format(new Date()) + "]>>> " + str;
        logFile.println(line);
        System.out.println(line);
    }

    /**
     * Imprime en pantalla y escribe al log un trigger rechazado.
     *
     * @param trigger es el trigger.
     */
    public static void reject(Trigger trigger) {
        String line = "REJECT[" + sdf.format(new Date()) + "]>>> " + trigger;
        logFile.println(line);
        System.out.println(line);
    }
}
